import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import { visualizer } from 'rollup-plugin-visualizer'
import { fileURLToPath, URL } from 'node:url'
import { defineConfig, loadEnv } from 'vite'
import Components from 'unplugin-vue-components/vite'
import compression from 'vite-plugin-compression'
import AutoImport from 'unplugin-auto-import/vite'
import WindiCSS from 'vite-plugin-windicss'
import vue from '@vitejs/plugin-vue'

/**
 * Vite 配置导出函数
 * @param {{ mode: string }} param0 - 包含当前运行模式的对象
 * @returns {Object} Vite 配置对象
 */
export default defineConfig(({ mode }) => {
	// 合并当前进程环境变量和从指定模式加载的环境变量
	process.env = { ...process.env, ...loadEnv(mode, process.cwd()) }
	// 打印调试信息（已注释）
	// console.log(`当前模式->${mode}，接口地址->${process.env.VITE_API_BASEURL}`);
	// 返回 Vite 配置对象
	return {
		// 设置项目的基本路径
		base: '/',
		// 注册插件
		plugins: [
			// Vue 插件
			vue(),
			// Windi CSS 插件
			WindiCSS(),
			// 自动导入插件，并配置解析器
			AutoImport({
				resolvers: [ElementPlusResolver()],
				imports: ['vue', 'vue-router'],
				dirs: ['./src/utils', './src/api', './src/lang', './src/stores'],
				dts: true,
				eslintrc: {
					enabled: true,
					filepath: './.eslintrc-auto-import.json',
					globalsPropValue: true
				}
			}),
			// 组件自动导入插件，并配置解析器
			Components({
				resolvers: [ElementPlusResolver()],
				dts: true
			}),
			// 文件压缩
			compression({
				verbose: true,
				disable: false,
				threshold: 10240,
				algorithm: 'gzip',
				ext: '.gz'
			}),
			// 文件统计信息
			visualizer({
				open: true,
				filename: 'dist/stats.html',
				template: 'sunburst'
			})
		],
		// 设置scss的api类型为modern-compiler
		css: {
			preprocessorOptions: {
				scss: {
					api: 'modern-compiler'
				}
			}
		},
		// 配置路径别名
		resolve: {
			alias: {
				// '@' 指向'src' 目录
				'@': fileURLToPath(new URL('./src', import.meta.url)),
				// '@addons' 指向'src/addons' 目录
				'@addons': fileURLToPath(new URL('./src/addons', import.meta.url))
			}
		},
		// 服务器配置
		server: {
			// 设置接口代理
			proxy: {
				// 对以 '/api' 开头的请求进行代理
				'/api': {
					// 代理的目标地址
					target: process.env.VITE_API_BASEURL,
					// 改变请求头的源信息，以解决跨域问题
					changeOrigin: true,
					// 重写请求路径
					rewrite: (path) => path.replace(/^\/api/, '')
				}
			}
		},
		// 打包配置
		build: {
			target: 'es2015', // 或者 'es2017'，视兼容需求而定
			rollupOptions: {
				output: {
					// 手动分包
					manualChunks(id) {
						if (id.includes('node_modules')) {
							if (id.includes('element-plus')) {
								// Element Plus 单独打包
								return 'element-plus'
							}
							if (id.includes('vue')) {
								// Vue 核心库单独打包
								return 'vue-core'
							}
							return 'vendor' // 其余第三方依赖打包进 vendor
						}
					},
					// 定制输出文件名
					chunkFileNames: 'assets/js/[name]-[hash].js',
					entryFileNames: 'assets/js/[name]-[hash].js',
					assetFileNames: 'assets/[ext]/[name]-[hash].[ext]'
				}
			}
		}
	}
})
